package tg.game.lottery.crawler;

import java.text.ParseException;
import java.util.List;
import java.util.Map;

import org.nutz.http.Http;
import org.nutz.http.Response;

import com.alibaba.druid.util.StringUtils;

import tg.game.util.timeline.IntervalTask;
import tg.game.util.timeline.TimeLine;

/**
 * 爬虫任务（定时间隔任务）
 * @author NKW
 * 根据指定网址，请求回来开奖信息，让指定的解析器解析出开奖信息，丢给缓存处理（缓存在内存，有新的会插入数据库）
 */
 public class CrawlerTask extends IntervalTask{
	private static LotteryCache lotteryCache;//缓存抓奖缓存,此缓存最好共用的，是所有的爬虫任务共用的,只要设定一次就好
	
	private String url;//要爬的网页url
	private String urlBak;//要爬的网页url_备用, 它和主页在不行时互相切换
	private String curUrl;//当前使用的url
	private LotteryParser parser;//解析器

	private int bindId;//绑定的id:三个开奖列，绑定在哪列上
	private String bindGid;//如果是单个游戏的抓奖，有可能抓回来的没有gid，所以要用绑定的，但是多游戏的不需要
	
	/**
	 * 构造函数 
	 * @param name      任务名称
	 * @param interval  抓奖间隔
	 * @param bindId    绑定的开奖列（只能是1、2、3，不然会出错）
	 */
	public CrawlerTask(String name,int interval,int bindId) {
		super(interval);
		this.bindId = bindId;
		this.setName(name);
		if (bindId < 1 || bindId > 3){
			System.err.println("bindId只有1、2、3，不能有其他值："+bindId);
			System.exit(0);
		}
	}
	/**
	 * 任务执行
	 *    用当前网址请求开奖数据（出错时主备切换，如果有备的话）
	 *    用解析器解析出所有开奖行
	 *    丢给缓存器处理（缓存到内存或数据库）
	 */
	@Override
	public void execute() {
		Response response = null;
		try {
			response = Http.get(url);
		} catch (Exception e1) {
			e1.printStackTrace();
			this.switchUrl();//如果出错了，那就切换网址，直接返回，下次就用切换后的网址来抓奖
			return;//出错后什么都不做了，直接返回
		}
		String content = response.getContent();
		List<Map<String, String>> lotteryInfo = this.parser.parseLottery(content);//调用解析器解析，返回的格式有统一规定，必须达到
		for (Map<String, String> map : lotteryInfo) {
			try {
				lotteryCache.cache(map,bindId);//每条开奖记录都让缓存处理
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}//每条记录都拿去缓存处理就好
		}
	}
	private void switchUrl(){
		if (!StringUtils.isEmpty(this.urlBak)){
			if (this.curUrl.equals(this.url))
				this.curUrl = this.urlBak;//如果当前用的是主网址，那就切换成备用的网址
			else
				this.curUrl = this.url;//否则切换成主网址
		}
	}
	@Override
	public void release() {
	}
	public String getUrl() {
		return url;
	}
	public void setUrlInfo(String url,String urlBak) {
		this.url = url;
		this.urlBak = urlBak;
		this.curUrl = this.url;//默认用主的
	}
	public LotteryParser getParser() {
		return parser;
	}
	public void setParser(LotteryParser parser) {
		this.parser = parser;
	}
	
	public static LotteryCache getLotteryCache() {
		return CrawlerTask.lotteryCache;
	}
	public static void setLotteryCache(LotteryCache lotteryCache) {
		CrawlerTask.lotteryCache = lotteryCache;
	}
	
	public CrawlerTask copy(String newName,String newUrl,String newUrlBak){
		CrawlerTask ret = new CrawlerTask(newName, this.getInterval(), bindId);
		ret.setUrlInfo(newUrl, newUrlBak);
		ret.setNextExecTime(this.getNextExecTime());
		ret.setParser(this.getParser());
		ret.setTaskCompleteInterval(this.isTaskCompleteInterval());
		return ret;
	}
	public String getBindGid() {
		return bindGid;
	}
	public void setBindGid(String bindGid) {
		this.bindGid = bindGid;
	}
}